package com.lanou3g.code0411;

import com.lanou3g.code0411.exceptions.IndexOutException;

/**
 * Created by dllo on 18/4/11.
 */

// 动态数组扩容

// 用起来和数组差不多 一个什么都能放的容器
// 并且还不需要指定初始化长度
// 能随着 里面内容的多少,变大变小

    /*
    现在的问题是
    使用的是Object类型,啥都能放
    如果我们能够 在创建MyArray的时候,就能确定
    这个数组中 可以放的元素类型,那么在取出元素的时候
    就不会产生 类型转换了
     */
public class MyArray<E> {
    private Object[] dates; // 用来放元素的数组
    private int count; // 当前数组中已经存放元素个数

    public MyArray() {
        // 我们上来就定义一个能放10个元素的数组
        // 之所以取10,是因为我随便想的
        dates = new Object[10];
        count = 0;
    }

    public void put(E object) {
        // 放元素
        dates[count] = object;
        count++;
        // 放满了怎么办?
        if (count == dates.length) {
            // 放满了
            Object[] newArr = new Object[dates.length * 2];
            // 把旧数组中的所有元素放到新数组中
            for (int i = 0; i < dates.length; i++) {
                newArr[i]=dates[i];
            }
            // 把datas重新赋值成新的大的数组
            dates = newArr;
        }
    }

    public E get(int index) {
        // TODO 使用异常机制来解决
        // 根据下标取元素
       if (index<0 || index>=count){
            // 如果 输入的索引 超出了我们支持的范围
            // 那么我们就让程序崩溃,并给出确切的错误信息
            throw new IndexOutException(count-1,index);
        }
        return (E) dates[index];
    }

    public void remove(int index) {
        // 根据下标删元素
    }

    // 用来确定 有多少元素
    public int size(){
        return count;
    }
}
